import axios from 'axios'

const request = axios.create({
    baseURL: 'api/',
    timeout: 360000,
    // withCredentials: true, //是否跨域
    // transformRequest: [ function (data) {
    //    let newData = '';
    //    for(let k in data){
    //        if (Object.prototype.hasOwnProperty.call(data, k) === true){
    //            newData += encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) + '&'
    //        }
    //    }
    //    return newData
    // }]
});

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token，对请求参数统一加密
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8'; //todo 需要把登陆的请求 和 请求Jason 数据的请求分开封装

    // config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
    // config.headers['token'] = user.token;  // 设置请求头
    return config
}, error => {
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        return res;
    },
    error => {
        console.log('err' + error) // for debug
        return Promise.reject(error)
    }
)

const post = (url, data)=>{
    return new Promise((resolve,reject)=>{
        //这里的request与实例化axios的变量名一致
        request.post(url,data).then(res=>{
            resolve(res)
        }).catch(err=>{
            reject(err)
        })
    })
}

const put = (url,data)=>{
    return new Promise((resolve,reject)=>{
        //这里的request与实例化axios的变量名一致
        request.put(url,data).then(res=>{
            resolve(res)
        }).catch(err=>{
            reject(err)
        })
    })
}

const get = (url,data)=>{
    return new Promise((resolve,reject)=>{
        //这里的request与实例化axios的变量名一致
        request.get(url,{params:data}).then(res=>{
            resolve(res)
        }).catch(err=>{
            reject(err)
        })
    })
}

//这个的变量名称不能直接使用delete，因为delete是关键字
const delet = (url,data)=>{
    return new Promise((resolve,reject)=>{
        //这里的request与实例化axios的变量名一致
        request.delete(url,{params:data}).then(res=>{
            resolve(res)
        }).catch(err=>{
            reject(err)
        })
    })
}




export default { get, post, delet, put }

